
package com.huaweicloud.saaslanding.install.properties;

import static com.huaweicloud.saaslanding.install.constant.ModelConstant.CSE_PREFIX;

import com.huaweicloud.saaslanding.basic.enumeration.ServiceManageFrameTypeEnum;
import com.huaweicloud.saaslanding.basic.utils.CheckNullUtil;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;

import java.util.Objects;

/**
 * CSE
 *
 * @since 2022-03-21
 */
@EqualsAndHashCode
@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
@Validated
@ConfigurationProperties(prefix = CSE_PREFIX)
public class Cse {

    @Value("${saaslanding-install.config-discovery-frame.type:cse}")
    private String configType;

    /**
     * CSE 实例ID
     */
    private String instanceId;

    /**
     * CSE 项目ID
     */

    private String cseProjectId;

    /**
     * CSE 管理员用户名
     */

    private String name;

    /**
     * CSE 管理员密码
     */
    private String password;

    /**
     * CSE 注册中心地址
     */
    private String discoveryAddress;

    /**
     * CSE 配置中心地址
     */
    private String configAddress;

    /**
     * CSE 注册中心端口
     */
    private String discoveryPort;

    /**
     * CSE 配置中心端口
     */
    private String configPort;

    /**
     * CSE 实例公网IP
     */
    private String cseEip;

    public String getInstanceId() {
        if (Objects.equals(ServiceManageFrameTypeEnum.CSE.getName(), configType)
            && CheckNullUtil.isNotNull(instanceId)) {
            return instanceId;
        } else {
            throw new IllegalArgumentException("未启用CSE或未配置实例ID(cse.instanceId)");
        }
    }

    public String getCseProjectId() {
        if (Objects.equals(ServiceManageFrameTypeEnum.CSE.getName(), configType)
            && CheckNullUtil.isNotNull(cseProjectId)) {
            return cseProjectId;
        } else {
            throw new IllegalArgumentException("未启用CSE或未配置实例ID(cse.cseProjectId)");
        }
    }

    public String getName() {
        if (Objects.equals(ServiceManageFrameTypeEnum.CSE.getName(), configType) && CheckNullUtil.isNotNull(name)) {
            return name;
        } else {
            throw new IllegalArgumentException("未启用CSE或未配置管理员用户名(cse.name)");
        }
    }

    public String getPassword() {
        if (Objects.equals(ServiceManageFrameTypeEnum.CSE.getName(), configType) && CheckNullUtil.isNotNull(password)) {
            return password;
        } else {
            throw new IllegalArgumentException("未启用CSE或未配置管理员密码(cse.password)");
        }
    }

    public String getDiscoveryAddress() {
        if (Objects.equals(ServiceManageFrameTypeEnum.CSE.getName(), configType)
            && CheckNullUtil.isNotNull(discoveryAddress)) {
            return discoveryAddress;
        } else {
            throw new IllegalArgumentException("未启用CSE或未配置注册中心地址(cse.discoveryAddress)");
        }
    }

    public String getConfigAddress() {
        if (Objects.equals(ServiceManageFrameTypeEnum.CSE.getName(), configType)
            && CheckNullUtil.isNotNull(configAddress)) {
            return configAddress;
        } else {
            throw new IllegalArgumentException("未启用CSE或未配置配置中心地址(cse.configAddress)");
        }
    }

    public String getDiscoveryPort() {
        if (Objects.equals(ServiceManageFrameTypeEnum.CSE.getName(), configType)
            && CheckNullUtil.isNotNull(discoveryPort)) {
            return discoveryPort;
        } else {
            throw new IllegalArgumentException("未启用CSE或未配置配置中心地址(cse.discoveryPort)");
        }
    }

    public String getConfigPort() {
        if (Objects.equals(ServiceManageFrameTypeEnum.CSE.getName(), configType)
            && CheckNullUtil.isNotNull(configPort)) {
            return configPort;
        } else {
            throw new IllegalArgumentException("未启用CSE或未配置配置中心端口(cse.configPort)");
        }
    }

    public String getCseEip() {
        if (Objects.equals(ServiceManageFrameTypeEnum.CSE.getName(), configType) && CheckNullUtil.isNotNull(cseEip)) {
            return cseEip;
        } else {
            throw new IllegalArgumentException("未启用CSE或未配置实例公网IP(cse.cseEip)");
        }
    }
}
